什麼是執行序 (Process)? 簡單說即為將指令執行後載入至記憶體 (Memory) 中稱之,而所有執行序則儲存於 /proc 中,如下練習中在 GUI 環境下執行 top & 將該程序丟到背景執行,系統顯示其 PID 當然您也可使用 ps 指令來查詢,而當程序執行時可看到在 /proc 中自動建立以該 PID 命名的資料夾,若關閉該執行序則相對的在 /proc 中的資料夾便立即消失 (從記憶體中釋放)。
#top & //執行 xclock 並丟到背景執行
[1] 13528 //顯示其 PID
#ps aux |grep top //使用指令 ps 也可查詢其 PID
root 13528 0.0 0.0 2464 688 pts/0 T 07:55 0:00 top
#ls -l /proc/13528 | grep top //查詢 /proc 資料夾下其 PID 資料夾內容可發現執行指令的絕對路徑
lrwxrwxrwx. 1 root root 0 Oct 17 07:56 exe -> /usr/bin/top
#ls -l /proc/13528 //關閉該執行序後資料夾便立即消失 (從記憶體中釋放)
ls: cannot access /proc/13528: No such file or directory
----- 執行序狀態 -----
當我們鍵入指令 ps aux 來查詢目前系統所執行的所有執行序 (Process) 我們可看到啟動該執行序的使用者 USER、PID 號碼、CPU 使用時間、Memory 使用時間 ...等,其中有一個欄為位 STAT 也就是 執行序狀態 (Process State),本文即為了解相關的縮寫意義。
S: Sleep (目前未執行但受到觸發後即轉變為 Run)
R: Run
T: sTopped (kill -19)
N: 低優先權
D: Uninterruptable sleep (不可中斷的休眠,例如 H/W、I/O),例如執行指令 eject 退出光碟機拖盤,這是屬於硬體 I/O 也就是執行後就要做完即使是 root 也無法停止該動作的執行 (無法時拖盤退到一半時停住吧!)。
Z: Zombie (死掉的子行程)
<: 高優先權
鍵入指令 ps aux 即可查詢目前系統上所有 Process 及顯示所有欄位
#ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 2824 1400 ? Ss Oct07 0:01 /sbin/init
root 2 0.0 0.0 0 0 ? S Oct07 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Oct07 0:00 [migration/0]
...略...
若您不想查看所有欄位也可指令要顯示的欄位,請鍵入如下指令:
#ps axo pid,user,cmd,stat
PID USER CMD STAT
1 root /sbin/init Ss
2 root [kthreadd] S
3 root [migration/0] S
...略...
----- 執行序狀態 (Sleep、Run) -----
程序執行後即到此狀態,如下執行指令 sh sleep.sh & 後查看其狀態即為 Sleep,但此時程序仍未結束而是在等待中,若觸發後狀態變會轉變為 Run。
#cat sleep.sh
#!/bin/sh
sleep 60
echo "Sleep 60 second!!"
#sh sleep.sh &
[1] 13598
#ps axo pid,user,cmd,stat | grep sleep
13598 root sh sleep.sh S
13599 root sleep 60 S
----- 執行序狀態 (sTopped) -----
可利用指令 kill -19 command 來對指定的程序執行 暫停 的動作,若要解除對程序的暫停請使用指令 kill -18 command 來達成。
#sh sleep.sh &
[2] 13641
#kill -19 13641
#ps axo pid,user,cmd,stat | grep sleep
13641 root sh sleep.sh T
13642 root sleep 60 S
----- 執行序狀態 (Uninterruptable sleep) -----
Uninterruptable sleep 不可中斷的休眠,例如 退出光碟機拖盤因為這是屬於硬體 I/O 也就是執行後就要做完即使是 root 也無法停止該動作的執行,您可嘗試當光碟機拖盤進行退出或收回時終止該動作 (相信無法使拖盤退到一半時停住吧!),在執行退出及收回光碟機拖盤時其狀態便為 D (Uninterruptable sleep)。
eject: 退出光碟機拖盤
eject -r: 收回光碟機拖盤
----- 執行序優先權 (nice) -----
系統的程序執行優先權數值範圍為 -20 ~ 19 而優先權數值 -20 為最高優先權數值 19 為最低,所有程序的預設優先權數值為 0,以下為 root 及一般使用者所能使用的優先權數值及程序狀態。
root
Priority Setting: -20 ~ 19
Process State (-20 ~ 0): <
Process State (0 ~ 19): N
non-root
Priority Setting: 0 ~ 19
Process State (0 ~ 19): N
從上面說明我們可了解只有 root 能設定優先權數值 -20 ~ 19 而一般使用者僅能設定優先權數值 0 ~ 19,至於如何改變優先權數值? 我們可利用指令 nice、renice。
nice: 指定程序的優先權數值
renice: 改變已執行程序的優先權數值
----- 執行序訊號 (kill Signals) -----
我們可利用指令 kill 來送訊號 (Signals) 給指定的程序,常用的訊號 (Signals) 如下:
-9: 強制
-15: 結束 (預設值)
-18: 解除暫停
-19: 暫停
1: 重新讀取設定檔
-l: 列出所有訊號 (Signals) 數值
#ps alx | grep -E 'udevd|rtkit-daemon' //nice 值為 -2 及 -4 狀態為 <,而值為 1 狀態為 N
5 0 455 1 16 -4 2768 1284 - S<s ? 0:00 /sbin/udevd -d
5 0 1399 455 18 -2 3424 1960 - S< ? 0:00 /sbin/udevd -d
5 0 1400 455 18 -2 3424 1920 - S< ? 0:00 /sbin/udevd -d
4 499 1803 1 21 1 25052 1172 - SNl ? 0:00 /usr/libexec/rtkit-daemon
----- 執行序互動管理 (top) -----
在指令模式下我們可利用指令 top 來即時觀察系統程序,並可透過相關熱鍵來對指定的欄位進行排序,常用熱鍵如下:
P: 對 CPU 欄位進行排序
M: 對 Memory 欄位進行排序
T: 對 Time 欄位進行排序
h: 顯示幫助頁面
q: 離開
----- 前景/背景 行程控制 -----
當您在文字模式下執行某些指令時會 佔住 您的提示字元符號 (也就無法繼續輸入指令),此時您可將該指令丟到背景執行這樣您的前景 (也就是提示字元符號) 便可繼續輸入其它指令。
&: 可於執行指令時在最後面加上此符號將該指令丟到背景執行
Ctrl + z: 可將目前在前景執行的工作執行暫停的動作
fg [%job number]: 指定 job number 回到前景工作
bg [%job number]: 指定 job number 丟到背景執行
kill [-SIGNAL] [%job number]: 指定 SIGNAL (ex. -19) 給 job number
jobs -l: 顯示所有背景執行的工作列表
# top & //執行 top 並將該指令丟到背景執行
[1] 13676
#sh sleep.sh & //執行 sleep.sh 並將該指令丟到背景執行
#jobs -l //顯示目前所有在背景執行的工作列表
[1]+ 13676 Stopped (tty output) top
[2]- 13677 Running sh sleep.sh &
----- 執行序樹狀結構 (pstree) -----
可以配合 pstree 套件來輔助我們即時了解執行序樹狀結構,例如我們查詢 sshd 的執行序樹狀結構,可以看到整個 sshd 的母程序 PID 為 1438 負責帶起子程序 PID 13504。
#pstree -aupU | grep sshd
├─sshd,1438
│ └─sshd,13504
│ ├─grep,13662 sshd
...略...
(上一篇)邁向 RHCE 之路 (Day10) - vi 編輯器及常用指令
(下一篇)邁向 RHCE 之路 (Day12) - 排程 (at、crontab、anacron)
邁向 RHCE 之路系列文章連結